#include <REGX52.H>
#include <INTRINS.H>
#include "onewire.h"

sbit OneWire_DQ=P3^7;

/**
  * @brief  OneWire单总线初始化
  * @param  无
  * @retval OneWire单总线从机应答位，返回0表示有从机应答，返回1表示无从机应答
  */
unsigned char OneWire_Init(void)
{
	unsigned char i;
	unsigned char AckBit;
	
	OneWire_DQ = 1;			//OneWire总线拉高
	OneWire_DQ = 0;			//OneWire总线拉低
	
	//Delay480us();			//OneWire总线拉低480us
	_nop_();i = 227;while (--i);	//Delay 500us
	
	OneWire_DQ = 1;			//OneWire释放总线
	
	
	
	_nop_();i = 29;while (--i);		//延时70us
	AckBit = OneWire_DQ;
	_nop_();i = 227;while (--i);	//Delay 500us
	
	return AckBit;
}

/**
  * @brief  OneWire总线发送1个Bit数据
  * @param  要发送的Bit位数据
  * @retval 无
  */
void OneWire_SendBit(unsigned char Bit)
{
	unsigned char i;
	
	OneWire_DQ = 0;					//OneWire总线拉低
	_nop_();i = 2;while (--i);		//Delay 10us
	
	OneWire_DQ = Bit;
	
	i = 29;while (--i);				//Delay 70us
	
	
	OneWire_DQ = 1;					//OneWire总线释放
}

/**
  * @brief  OneWire总线接收一位数据
  * @param  无
  * @retval OneWire总线接收到的一位Bit数据
  */
unsigned char OneWire_ReceiveBit(void)
{
	unsigned char Bit;
	unsigned char i;
	
	OneWire_DQ = 0;
	_nop_();_nop_();_nop_();_nop_();	//Delay 5us
	
	OneWire_DQ = 1;
	_nop_();_nop_();_nop_();_nop_();	//Delay 5us，然后采样
	Bit = OneWire_DQ;
	
	i = 22;while (--i);					//Delay 50us 
	//_nop_();i = 29;while (--i);		//Delay 70us
	
	return Bit;
}

/**
  * @brief  OneWire总线发送一个字节数据
  * @param  要发送的一个字节数据
  * @retval 无
  */
void OneWire_SendByte(unsigned char Byte)
{
	unsigned char i;
	
	for(i=0; i<8; i++)
	{
		OneWire_SendBit(Byte & (0x01<<i));		//OneWire总线先发送低位然后发送高位
	}
}

/**
  * @brief  OneWire总线接收一个字节数据
  * @param  无
  * @retval 接收到的一个字节的数据
  */
unsigned char OneWire_ReceiveByte(void)
{
	unsigned char i;
	unsigned char Byte = 0;
	
	for(i=0; i<8; i++)
	{
		if(OneWire_ReceiveBit())
			Byte |= (0x01 << i);
	}
	
	return Byte;
}

